﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace SingletonPattern
{
    /// <summary>
    /// 单例模式 （多线程， 单线程）
    /// 3种写法
    /// 
    /// 优点： 整个进程中，只被实例化一次
    /// 缺点： 常驻内存
    /// 
    /// 普通类型用的时候 才实例化，用完被gc回收
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("设计模式特训");
                Singleton简单写法.createInstance();
                Singleton简单写法.createInstance();
                //new Action(() => { }).BeginInvoke(a => { }, null);
                //Singleton s = new Singleton();
                //for (int i = 0; i < 10; i++)
                //{
                //    s.show();
                //}

                List<IAsyncResult> resultList = new List<IAsyncResult>();
                for (int i = 0; i < 10; i++)
                {
                    //new Action(() => {}).BeginInvoke() 高级写法。 相当于 手动起 很多线程
                    resultList.Add( new Action(() => {
                        Singleton singleton = Singleton.CreateInstance();
                        singleton.show();
                    }).BeginInvoke(abc=> { Console.WriteLine("------------"); }, null));  //启动一个异步多线程
                 
                }

                while(resultList.Count(r=>!r.IsCompleted)>0)
                {
                    Thread.Sleep(10);
                }

                for (int i = 0; i < 10; i++)
                {
                    resultList.Add(new Action(() => {
                        Singleton singleton = Singleton.CreateInstance();
                        singleton.show();
                    }).BeginInvoke(abc => { Console.WriteLine(" ------------ "); }, null));  //启动一个异步多线程

                }

                //StudentA.UseSingleton();
                //StudentB.UseSingleton();
                StudentC.UseSingleton();


            }
            catch (Exception ex)
            {

            }
            Console.Read();
        }
    }
}
